#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>

#define NBLIGNECOL 3
#define NBMAT 3

typedef struct {

	int** mat;

}matrice_t;

typedef struct {

     pthread_t trh;
     int tab[2];

}thread;

matrice_t* matrice;

void creemat (matrice_t* matrice ) {

	int i,j;

	matrice->mat=(int**)malloc(NBLIGNECOL*sizeof(int*));
	for(i=0;i<NBLIGNECOL;i++)
		matrice->mat[i]=(int*)malloc(NBLIGNECOL*sizeof(int));

	for(i=0;i<NBLIGNECOL;i++) {
		for(j=0;j<NBLIGNECOL;j++) {
			matrice->mat[i][j]=(int)((rand()%20)+1);
		}
	}

}

void multij(thread* id) {

	int somme=0;
	int l;

	for(l=0;l<NBLIGNECOL;l++){
		somme += matrice[0].mat[l][id->tab[1]]*matrice[1].mat[id->tab[0]][l];
	}


	matrice[2].mat[id->tab[0]][id->tab[1]]=somme;

	//printf("I : %d  J : %d  Somme : %d\n",tab[0],tab[1],somme);


}



int main (int argc , char** argv ) {

	srand(time(NULL));

	int i,j;

	pthread_t id[3];

	thread calc[NBLIGNECOL][NBLIGNECOL];

	matrice = (matrice_t*)malloc(NBMAT*sizeof(matrice_t));

	for(i=0;i<NBMAT;i++) {

		if( pthread_create(&id[i],NULL,(void*)creemat,&matrice[i]) != 0 ) {
			fprintf(stderr,"Erreur Thread Mat %d : ",i+1);
			exit(i+1);
		}

	}

	pthread_join(id[0],NULL);
	pthread_join(id[1],NULL);
	pthread_join(id[2],NULL);

	printf("Matrice 1 : \n");
	for(i=0;i<NBLIGNECOL;i++) {
		for(j=0;j<NBLIGNECOL;j++) {
				printf("%d\t",matrice[0].mat[i][j]);
		}
		printf("\n");
	}

	printf("Matrice 2 : \n");
	for(i=0;i<NBLIGNECOL;i++) {
		for(j=0;j<NBLIGNECOL;j++) {
				printf("%d\t",matrice[1].mat[i][j]);
		}
		printf("\n");
	}

	for(i=0;i<NBLIGNECOL;i++) {
		for(j=0;j<NBLIGNECOL;j++) {
					calc[i][j].tab[0]=i;
					calc[i][j].tab[1]=j;
					//printf("MAINBLIGNECOL  I : %d  J : %d \n",calc[i][j].tab[0],calc[i][j].tab[1]);
					if( pthread_create(&calc[i][j].trh,NULL,(void*)multij,&calc[i][j]) != 0 ) {
						perror("Erreur Thread Calc : ");
						exit(4);
					}
		}
	}


	for(i=0;i<NBLIGNECOL;i++){
		for(j=0;j<NBLIGNECOL;j++){
			pthread_join(calc[i][j].trh,NULL);
		}
	}

	printf("Matrice 3 : \n");
	for(i=0;i<NBLIGNECOL;i++) {
		for(j=0;j<NBLIGNECOL;j++) {
				printf("%d\t",matrice[2].mat[i][j]);
		}
		printf("\n");
	}



	return 0;
}





